# -*- coding: UTF-8 -*-
# Auther: youren.S

import os
import shutil
import win32com
import win32com.client
# from win32com.client import constants
from PIL import Image
import fnmatch  

import pythoncom  # 增加导入
def get_ppt_files(directory):  
    ppt_files = []  
    for root, dirs, files in os.walk(directory):  
        for filename in fnmatch.filter(files, '*.ppt'):  
            ppt_files.append(os.path.join(root, filename))  
        for filename in fnmatch.filter(files, '*.pptx'):  
            ppt_files.append(os.path.join(root, filename))  
    return ppt_files  

# wc = win32com.client.constants
def output_file(ppt_path):
    """
    判断文件是否存在并生成图片保存目录
    :param ppt_path: ppt文件路径
    :return: 文件保存目录
    """
    output_path = ""
    if os.path.exists(ppt_path):
        fname, ext = os.path.splitext(ppt_file)
        output_path = os.path.join(ppt_dir, fname)
        if os.path.isdir(output_path):
            shutil.rmtree(output_path)
        os.mkdir(output_path)
    return output_path


def ppt2png(ppt_path, long_sign: str):
    """
    ppt 转 png 方法
    :param ppt_path: ppt 文件的绝对路径
    :param long_sign: 是否需要转为生成长图的标识
    :return:
    """
    if os.path.exists(ppt_path):
        output_path = output_file(ppt_dirfile)  # 判断文件是否存在
        pythoncom.CoInitialize()
        ppt_app = win32com.client.Dispatch('PowerPoint.Application')
        # 设置为0表示后台运行，不显示，1则显示
        ppt_app.Visible = 1
        ppt = ppt_app.Presentations.Open(ppt_path)  # 打开 ppt
        ppSaveAsJPG = 17
        ppt.SaveAs(output_path, ppSaveAsJPG)  # 17表示 ppt 转为图片
        ppt_app.Quit()  # 关闭资源，退出

        if 'Y' == long_sign.upper():
            generate_long_image(output_path)  # 合并生成长图

    else:
        raise Exception('请检查文件是否存在！\n')


def generate_long_image(output_path):
    """
    将ppt的各个页面拼接成长图
    :param output_path:
    :return:
    """
    picture_path = output_path
    last_dir = os.path.dirname(picture_path)  # 上一级文件目录

    # 获取图片列表
    # ims = [Image.open(os.path.join(picture_path, fn)) for fn in os.listdir(picture_path) if fn.endswith('.jpg')]
    ims = []
    for fn in os.listdir(picture_path):
        if fn.lower().endswith('.jpg'):
            ims.append(os.path.join(picture_path, fn))

    # print(ims)
    # 将获取到ppt的页面进行排序
    ims_sort = sorted(ims, key=lambda jpg: len(jpg))
    print(ims_sort)

    width, height = Image.open(ims[0]).size  # 取第一个图片尺寸
    long_canvas = Image.new(Image.open(ims[0]).mode, (width, height * len(ims)))  # 创建同宽，n倍高的空白图片

    # 拼接图片
    for i, image in enumerate(ims_sort):
        long_canvas.paste(Image.open(image), box=(0, i * height))
    long_canvas.save(os.path.join(last_dir, ppt_name1+'.png'))  # 保存长图

if __name__ == '__main__':
    cur_path = os.getcwd()
    ppt_dir = r"E:\code\ppt"
    # ppt_dir = input(r"输入PPT所在目录的绝对路径：")
    # ppt_file = input(r"输入PPT文件名称，含后缀(如ppt&pptx)：")

    ppt_files = get_ppt_files(ppt_dir)  
    for ppt_file in ppt_files:  
        # print(os.path.basename(ppt_file))
        ppt_file = os.path.basename(ppt_file)
        ppt_name1,ppt_name2 = ppt_file.split(".")
        file_ext = os.path.splitext(ppt_file)[1]
        # 判断文件后缀
        if file_ext == ".ppt" or file_ext == ".pptx":
            print("="*60)
        else:
            print("请检查文件后缀是否正确。")

        ppt_dirfile = ppt_dir + '/' + ppt_file
        ppt_path = os.path.join(cur_path, ppt_dirfile)   # 需要使用绝对路径，否则会报错
        print(ppt_path)
        long_sign = "y"
        # long_sign = "n"
        ppt2png(ppt_path, long_sign)

    
